package com.hyopt.common.base;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.function.Function;

/**
 * 基础实现类接口
 *
 * @author wanglei
 * @date 2019-06-06 13:47:46
 */
public interface BaseService<T, M extends BaseParamsForm> extends IService<T> {

	/**
	 * 查询
	 *
	 * @param id
	 * @param clazz
	 * @return
	 */
	<V> V queryVoById(Long id, Class<V> clazz);

	/**
	 * 查询
	 *
	 * @param id
	 * @param clazz
	 * @param status
	 * @return
	 */
	<V> V queryVoByIdAndStatus(Long id, Class<V> clazz, boolean status);

	/**
	 * 获取主键id
	 *
	 * @return
	 */
	String getIdKey();

	/**
	 * 获取实体类名称
	 *
	 * @return
	 */
	String getEntityName();

	/**
	 * 查询
	 *
	 * @param id
	 * @param clazz
	 * @param funArray
	 * @return
	 */
	<V> V queryVoById(Long id, Class<V> clazz, ConvertFun<Object, V>... funArray);

	/**
	 * 查询
	 *
	 * @param id
	 * @param clazz
	 * @param status
	 * @param funArray
	 * @return
	 */
	<V> V queryVoByIdAndStatus(Long id, Class<V> clazz, boolean status, ConvertFun<Object, V>... funArray);

	/**
	 * 查询集合
	 *
	 * @param wrapper
	 * @param clazz
	 * @return
	 */
	<V> List<V> queryVoList(QueryWrapper<T> wrapper, Class<V> clazz);

	/**
	 * 查询集合
	 *
	 * @param form
	 * @param clazz
	 * @return
	 */
	<V> List<V> queryVoList(QueryForm<M> form, Class<V> clazz);

	/**
	 * 集合转换
	 *
	 * @param list
	 * @param clazz
	 * @return
	 */
	<V> List<V> convertToListVo(List list, Class<V> clazz);

	/**
	 * 集合转换
	 *
	 * @param list
	 * @param clazz
	 * @param funArray
	 * @return
	 */
	<V,M> List<V> convertToListVo(List<M> list, Class<V> clazz, ConvertFun<Object, V>... funArray);

	/**
	 * 查询分页
	 *
	 * @param page
	 * @param wrapper
	 * @param clazz
	 * @return
	 */
	<V> IPage<V> queryVoPage(IPage<T> page, QueryWrapper<T> wrapper, Class<V> clazz);

	/**
	 * 查询分页（map）
	 *
	 * @param iPage
	 * @param queryWrapper
	 * @param clazz
	 * @param <V>
	 * @return
	 */
	<V> IPage<V> queryMapVoPage(IPage<T> iPage, QueryWrapper<T> queryWrapper, Class<V> clazz);

	/**
	 * 查询分页
	 *
	 * @param form
	 * @param clazz
	 * @return
	 */
	<V> IPage<V> queryVoPage(QueryForm<M> form, Class<V> clazz);

	/**
	 * 转变
	 *
	 * @param iPage
	 * @param clazz
	 * @return
	 */
	<V> IPage<V> convertToPageVo(IPage iPage, Class<V> clazz);

	/**
	 * 转变
	 *
	 * @param iPage
	 * @param clazz
	 * @param funArray
	 * @return
	 */
	<V,M> IPage<V> convertToPageVo(IPage<M> iPage, Class<V> clazz, ConvertFun<Object, V>... funArray);

	/**
	 * 新增
	 *
	 * @param userId
	 * @param form
	 * @return
	 */
	T saveForm(Long userId, Object form);

	/**
	 * 更新
	 *
	 * @param userId
	 * @param form
	 * @return
	 */
	T updateForm(Long userId, Object form);

	/**
	 * 保存或更新
	 *
	 * @param entity
	 * @return
	 */
	T saveOrUpdateEntity(T entity);

	/**
	 * 禁用
	 *
	 * @param userId
	 * @param idList
	 * @return
	 */
	boolean disableByIdList(Long userId, List<Long> idList);

	/**
	 * 启用
	 *
	 * @param userId
	 * @param idList
	 * @return
	 */
	boolean enableByIdList(Long userId, List<Long> idList);

	/**
	 * 更新状态
	 *
	 * @param userId
	 * @param idList
	 * @param status
	 * @return
	 */
	boolean updateStatus(Long userId, List<Long> idList, boolean status);

	/**
	 * 通过id集合更新entity
	 *
	 * @param userId
	 * @param idList
	 * @param funArray
	 * @return
	 */
	boolean updateByIdList(Long userId, List<Long> idList, Function<UpdateWrapper<T>, UpdateWrapper<T>>... funArray);

	/**
	 * 工具更新
	 *
	 * @param userId
	 * @param funArray
	 * @return
	 */
	boolean updateByUserId(Long userId, Function<UpdateWrapper<T>, UpdateWrapper<T>>... funArray);

	/**
	 * 工具更新
	 *
	 * @param userId
	 * @param eq
	 * @param funArray
	 * @return
	 */
	boolean updateByUserId(Long userId, UpdateWrapper<T> eq, Function<UpdateWrapper<T>, UpdateWrapper<T>>... funArray);

	/**
	 * 删除
	 *
	 * @param userId
	 * @param idList
	 * @return
	 */
	boolean deleteByIdList(Long userId, List<Long> idList);

	/**
	 * 获得查询参数
	 *
	 * @param form
	 * @param isOrder
	 * @return
	 */
	QueryWrapper<T> getSelectWrapper(QueryForm<M> form, boolean isOrder);
}
